import abc
import argparse

class BaseOptions(metaclass=abc.ABCMeta):
    """命令行选项参数父类，任何一个类型的参数都应该继承该类，并重写相应方法。
    """

    def __init__(self):
        self.initialized = False

    def initialize(self):
        """初始化命令行参数对象 ArgumentParser"""
        if not self.initialized:
            self.parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
            self.initialized = True
        return self.parser

    def print_options(self, opt):
        """在控制台打印命令行选项参数信息"""
        message = "----------------- Options ---------------\n"
        for k, v in sorted(vars(opt).items()):
            comment = ""
            default = self.parser.get_default(k)
            if v != default:
                comment = "\t[default: %s]" % str(default)
            message += "{:>25}: {:<30}{}\n".format(str(k), str(v), comment)
        message += "----------------- End -------------------"
        print(message)

    @abc.abstractmethod
    def parse(self):
        """解析命令行参数选项信息，子类应重写该方法返回解析后参数信息"""
        pass
